在 Day 10,我把原本的 Header 從 HTML/CSS 的思維轉換成 Angular Component。
完成之後,我開始發現:
如果 Header 可以做成 Component,那 Footer 是不是也應該這樣做?
我的智慧醫院網站幾乎每個頁面都有相同的 Header 和 Footer。
如果每個頁面都重新寫一次,不但會產生很多重複程式碼,之後修改也會變得很麻煩。
所以今天要繼續延伸 Angular Component 的概念,開始把整個網站的共用結構整理起來。
今天的目標是建立:
Header
↓
Main Content
↓
Footer
讓網站開始具有比較完整、正式的前端架構。
在一開始寫網頁時,我可能會直接把所有東西放在同一個頁面:
HTML
├── Header
├── 首頁內容
├── Footer
如果只有一個頁面,這樣看起來沒有什麼問題。
但我的智慧醫院網站並不只有首頁。
目前已經有:
首頁
醫師查詢
醫師詳細資訊
登入
預約掛號
我的預約
...
如果每一頁都自己寫:
Header
頁面內容
Footer
就會變成:
首頁
├── Header
├── Home Content
└── Footer
醫師查詢
├── Header
├── Doctor Query Content
└── Footer
醫師詳細資訊
├── Header
├── Doctor Detail Content
└── Footer
可以看到 Header 和 Footer 被重複很多次。
這就是我今天想解決的問題。
Angular Component 的其中一個重要概念就是:
把網站拆成一個一個可以獨立管理的區塊。
例如我的網站可以先拆成:
網站
│
├── Header
│
├── Main Content
│
└── Footer
其中:
負責:
負責:
負責:
這樣不同區域就有自己的責任。
在 Day 10,我已經完成 Header Component。
所以現在不需要在每一個頁面重新寫:
<header>
...
</header>
而是可以直接使用:
<app-header></app-header>
讓 Angular 顯示 Header Component。
這樣不管使用者現在是在:
首頁
還是:
醫師查詢
或:
醫師詳細資訊
都可以使用同一個 Header。
既然 Header 可以元件化,接下來就是 Footer。
以前可能會直接在每一個 HTML 頁面底下寫:
<footer>
...
</footer>
但現在我要把它獨立成:
FooterComponent
讓 Footer 自己管理:
Footer HTML
Footer CSS
Footer 相關內容
之後其他頁面只需要使用:
<app-footer></app-footer>
就可以顯示相同的 Footer。
我的智慧醫院網站 Footer 主要是網站資訊與聯絡方式。
例如:
智慧醫院
────────────────────
首頁
醫院介紹
醫師查詢
預約掛號
我的預約
地址
電話
© Smart Hospital
這些內容在不同頁面基本上都是一樣的。
因此非常適合做成共用 Component。
完成 Header 和 Footer 之後,我開始整理整個網站的主要架構。
目前可以先想成:
App
│
├── HeaderComponent
│
├── Main Content
│
└── FooterComponent
而 Main Content 並不是固定只有一個頁面。
它會配合前一天學習的 Angular Routing。
例如:
App
│
├── Header
│
├── Router Outlet
│ │
│ ├── Home
│ ├── Doctor Query
│ ├── Doctor Detail
│ ├── Login
│ └── Appointment
│
└── Footer
這樣就把 Component 和 Routing 兩個概念連在一起了。
router-outlet 就是主要內容的位置Day 9 學到的 router-outlet,現在就可以派上用場。
整體結構可以寫成:
<app-header></app-header>
<router-outlet></router-outlet>
<app-footer></app-footer>
這三個區域分別代表:
<app-header>
↓
網站 Header
<router-outlet>
↓
目前頁面的內容
<app-footer>
↓
網站 Footer
所以當使用者切換不同路由時:
首頁
會變成:
Header
↓
Home
↓
Footer
切換到:
醫師查詢
則變成:
Header
↓
Doctor Query
↓
Footer
Header 和 Footer 不需要重新建立。
中間的內容才會隨著 Routing 改變。
這是今天很重要的一個問題。
如果我直接複製:
Header
Footer
到每個頁面,一開始可能會覺得:
「反正可以正常顯示,好像也沒什麼問題。」
但是當網站越來越大,就會開始出現問題。
例如我想修改 Footer 的電話:
首頁 Footer → 修改
醫師查詢 Footer → 修改
醫師詳細資訊 Footer → 修改
登入 Footer → 修改
預約頁 Footer → 修改
每個地方都要修改。
如果不小心漏掉其中一頁,就可能出現不同頁面的資訊不一致。
如果 Footer 是:
FooterComponent
所有頁面都使用:
<app-footer></app-footer>
那麼之後只需要修改:
FooterComponent
就可以影響所有使用它的頁面。
變成:
FooterComponent
↓
┌─────┼─────┐
↓ ↓ ↓
首頁 查詢頁 詳細頁
這就是 Component 重複使用的好處。
做到這裡,我開始發現:
Component 並不是越多越好,而是要思考哪些東西值得被獨立管理。
例如目前我的網站:
| UI | 是否適合 Component |
|---|---|
| Header | ✓ |
| Footer | ✓ |
| 醫師卡片 | ✓ |
| FAQ | ✓ |
| Button | 視需求 |
| Modal | 視需求 |
| 單純文字區塊 | 不一定 |
判斷的方式可以先想:
如果很多地方都會出現,就很適合考慮 Component。
如果這個區塊有自己的互動或邏輯,也適合獨立管理。
如果未來可能經常修改,拆成 Component 會比較容易管理。
所以不是看到一個區塊就一定要拆成 Component。
而是要思考它在整個網站中的角色。
以前我比較容易用頁面來思考:
首頁
醫師查詢
醫師詳細資訊
登入
預約
但開始學 Angular Component 之後,我會開始換一種方式思考:
共用結構
├── Header
├── Main Content
└── Footer
頁面內容
├── Home
├── Doctor Query
├── Doctor Detail
├── Login
└── Appointment
這個轉換對我來說很重要。
因為網站不是很多個完全獨立的 HTML 頁面,而是由很多可以重複使用的元件組合而成。
到目前為止,我已經學到兩個重要概念:
解決:
不同頁面怎麼切換?
/
↓
/doctors
↓
/doctors/:id
解決:
網站內容怎麼拆分與重複使用?
Header
Footer
Doctor Card
FAQ
...
兩個概念結合起來後:
Angular
│
┌────────────┴────────────┐
↓ ↓
Component Routing
↓ ↓
網站如何拆分 頁面如何切換
│ │
└────────────┬────────────┘
↓
完整網站
這讓我的網站開始有比較清楚的架構。
目前整理之後,我的網站可以先規劃成:
App
│
├── HeaderComponent
│
├── Main
│ │
│ └── router-outlet
│ │
│ ├── HomeComponent
│ ├── DoctorQueryComponent
│ ├── DoctorDetailComponent
│ ├── LoginComponent
│ └── AppointmentComponent
│
└── FooterComponent
這個架構也開始對應到之前在 Figma 規劃的網站。
Figma 負責:
畫面設計
Component 設計
User Flow
Prototype
Angular 則開始負責:
Component
Routing
頁面結構
互動功能
也就是從設計階段慢慢進入真正的程式開發。
每個頁面都需要 Header 和 Footer,如果直接複製,會產生大量重複內容。
將 Header 和 Footer 分別建立成 Angular Component:
HeaderComponent
FooterComponent
再讓不同頁面共用。
如果 Header、Footer 和每個頁面都混在一起,網站架構會變得不清楚。
使用:
<router-outlet></router-outlet>
作為主要內容的位置。
讓 Header 和 Footer 固定,而中間內容由 Routing 決定。
如果看到每一個區塊都建立 Component,反而可能讓專案變得太複雜。
先判斷:
符合實際需求時再拆成 Component。
今天完成了網站主要結構的整理:
Header
↓
Main Content
↓
Footer
並將:
Header
Footer
都元件化。
再搭配昨天學到的 Routing:
Header
↓
router-outlet
↓
目前頁面
↓
Footer
現在網站已經不再只是「一個頁面一個 HTML」。
而是開始變成:
由不同 Component 組合而成的網站。
今天主要學習 Angular 的元件化概念:
| 概念 | 作用 |
|---|---|
| Component | 將網站拆成獨立、可管理的區塊 |
| HeaderComponent | 共用網站 Header |
| FooterComponent | 共用網站 Footer |
router-outlet |
顯示目前路由的頁面內容 |
| Component 拆分 | 減少重複程式碼、方便維護 |
| Routing + Component | 管理頁面切換與網站結構 |
今天最大的收穫是開始理解:
Angular 不只是把 HTML 寫進 Component,而是要開始思考整個網站應該怎麼拆。
目前網站的基本結構已經建立起來:
Header
↓
Main Content
↓
Footer
而醫師查詢頁也已經可以透過 Routing 進入。
下一步就可以開始處理真正的「資料」。
例如醫師查詢頁不可能永遠只有寫死的:
王醫師
李醫師
陳醫師
未來會需要讓 Angular 根據資料產生醫師卡片。
因此接下來要開始思考:
如何讓 Component 接收資料,然後根據不同資料顯示不同的內容?
這也會開始進入 Angular 裡非常重要的 Data Binding。